﻿
using System;
using System.Data.SqlClient;
using System.Globalization;
using System.Runtime.Serialization;
using ProtoBuf;/*https://github.com/ServiceStack/ServiceStack/tree/master/lib*/
using ServiceStack.Text;/*https://github.com/ServiceStack/ServiceStack.Text*/
using V82;
using V82.ОбщиеОбъекты;
using V82.СправочникиСсылка;
using V82.СправочникиОбъект;
using V82.ДокументыСсылка;
using V82.Перечисления;//Ссылка;
namespace V82.СправочникиОбъект
{
	///<summary>
	///(Общ)
	///</summary>
	[ProtoContract]
	[DataContract]
	public partial class СпособыРаспределенияЗатратНаВыпуск:СправочникОбъект
	{
		public bool _ЭтоНовый;
		public bool ЭтоНовый()
		{
			return _ЭтоНовый;
		}
		[DataMember]
		[ProtoMember(1)]
		public Guid Ссылка {get;set;}
		[DataMember]
		[ProtoMember(2)]
		public long Версия {get;set;}
		[DataMember]
		[ProtoMember(3)]
		public string ВерсияДанных {get;set;}
		/*static хэш сумма состава и порядка реквизитов*/
		/*версия класса восстановленного из пакета*/
		[DataMember]
		[ProtoMember(4)]
		public bool ПометкаУдаления {get;set;}
		[DataMember]
		[ProtoMember(5)]
		public bool Предопределенный {get;set;}
		[DataMember]
		[ProtoMember(6)]
		public string/*9*/ Код {get;set;}
		[DataMember]
		[ProtoMember(7)]
		public string/*50*/ Наименование {get;set;}
		///<summary>
		///(Общ)
		///</summary>
		[DataMember]
		[ProtoMember(8)]
		public string/*(0)*/ Комментарий {get;set;}
		///<summary>
		///(Общ)
		///</summary>
		[DataMember]
		[ProtoMember(9)]
		public V82.Перечисления/*Ссылка*/.СпособыРаспределенияЗатратНаВыпуск СпособРаспределенияЗатратНаВыпуск {get;set;}//Способ распределения затрат на выпуск
		///<summary>
		///(Общ)
		///</summary>
		[DataMember]
		[ProtoMember(10)]
		public V82.Перечисления/*Ссылка*/.ТипыФильтровПриРаспределенииЗатратНаВыпуск ТипФильтраПриРаспределенииЗатратНаВыпуск {get;set;}//Тип фильтра при распределении затрат на выпуск
		[DataMember]
		[ProtoMember(11)]
		public V82.Перечисления/*Ссылка*/.БазыРаспределенияЗатрат БазаРаспределенияЗатрат {get;set;}//База распределения затрат
		[DataMember]
		[ProtoMember(12)]
		public V82.Перечисления/*Ссылка*/.ВидыПоказателейБазыРаспределения ПоказательБазыРаспределения {get;set;}//Показатель базы распределения
		[DataMember]
		[ProtoMember(13)]
		public V82.СправочникиСсылка.ТипыЦенНоменклатуры ТипЦен {get;set;}//Тип цен
		[DataMember]
		[ProtoMember(14)]
		public V82.СправочникиСсылка.ОсновноеСырье ОсновноеСырье {get;set;}//Основное сырье
		[DataMember]
		[ProtoMember(15)]
		public V82.СправочникиСсылка.СпособыРаспределенияЗатратНаВыпуск СпособРаспределенияЗатратПоПодразделениям {get;set;}//Способ распределения затрат по подразделениям
		[DataMember]
		[ProtoMember(16)]
		public bool РаспределятьНаСобственнуюПродукцию {get;set;}//Распределять на собственную продукцию
		[DataMember]
		[ProtoMember(17)]
		public bool РаспределятьНаПродукциюСтороннегоПереработчика {get;set;}//Распределять на продукцию стороннего переработчика
		[DataMember]
		[ProtoMember(18)]
		public bool РаспределятьНаПродукциюИзДавальческогоСырья {get;set;}//Распределять на продукцию из давальческого сырья
		[DataMember]
		[ProtoMember(19)]
		public bool РаспределятьНаПодчиненныеПодразделения {get;set;}//Распределять на подчиненные подразделения
		[DataMember]
		[ProtoMember(20)]
		public bool РаспределятьНаНаработку {get;set;}//Распределять на наработку
		[DataMember]
		[ProtoMember(21)]
		public decimal/*(5.2)*/ Процент {get;set;}
		[DataMember]
		[ProtoMember(22)]
		public decimal/*(15.3)*/ Коэффициент {get;set;}
		[DataMember]
		[ProtoMember(23)]
		public V82.Перечисления/*Ссылка*/.ПорядкиОкругления ПорядокОкругления {get;set;}//Порядок округления
		[DataMember]
		[ProtoMember(24)]
		public ХранилищеЗначения НастройкиПостроителя {get;set;}//Настройки построителя
		[DataMember]
		[ProtoMember(25)]
		public bool ИзменитьНаПроцент {get;set;}//Изменить на процент
		[DataMember]
		[ProtoMember(26)]
		public bool ИзменитьНаКоэффициент {get;set;}//Изменить на коэффициент
		[DataMember]
		[ProtoMember(27)]
		public bool ОкруглитьДо {get;set;}//Округлить до
		[DataMember]
		[ProtoMember(28)]
		public ХранилищеЗначения СхемаКомпоновкиДанных {get;set;}//Схема компоновки данных
		[DataMember]
		[ProtoMember(29)]
		public V82.Перечисления/*Ссылка*/.ХарактерЗатрат Применимость {get;set;}//Для каких расходов применять
		///<summary>
		///При использовании этой базы распределение будет выполняться алгоритмом, основанным на схемах компоновки данных
		///</summary>
		[DataMember]
		[ProtoMember(30)]
		public bool ИспользоватьПростоеРаспределение {get;set;}//Использовать упрощенный алгоритм распределения расходов
		[DataMember]
		[ProtoMember(31)]
		public V82.Перечисления/*Ссылка*/.НаправленияРаспределенияЗатрат НаправлениеРаспределения {get;set;}//Куда распределять
		///<summary>
		///(Общ)
		///</summary>
		[DataMember]
		[ProtoMember(32)]
		public string/*(0)*/ КогдаПрименять {get;set;}//Область, условия применения
		[DataMember]
		[ProtoMember(33)]
		public V82.Перечисления/*Ссылка*/.ТипыБазРаспределения ТипБазыРаспределения {get;set;}//Тип базы
		public void Записать()
		{
			//Установка блокировки элемента на горизантально масштабированный кластер.
			//Опционально введение тайм аута на запись одного и того же объекта, не чаще раза в 5-секунд. Защита от спама. упращение алгоритма блокировки.
			//Выделение сервиса для блокировки элемента и генерации кода
			//Выполнение операций контроля без обращений к sql-серверу.
			//Контроль конфликта блокировок.
			//Контроль загрузки булкинсертом гетерогенной коллекции.
			//Контроль уникальности кода для справочников.
			//Контроль уникальности номера для документов, в границах префикса.
			//Контроль владельца, он не может быть группой.
			//Контроль владельца он должен быть задан.
			//Контроль родителя он должен быть группой.
			//Контроль количества уровней, должен соотвествовать метаданным.
			//Контроль версии, объект не должен был быть записан перед чтением текущей записи, алгоритм версионника.
			//Контроль уникальности ссылки
			//Контроль зацикливания
			//Опционально контроль битых ссылок.
			//Соблюдейние транзакционности. ПередЗаписью. Открытие транзации. Валидации. ПриЗаписи. Фиксация транзакции. Информирование о записи элемента.
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					if(_ЭтоНовый)
					{
						Команда.CommandText = @"
						Insert Into _Reference158(
						_IDRRef
						/*,_Version*/
						,_Marked
						,_IsMetadata
						,_Code
						,_Description
						,_Fld1924
						,_Fld1925RRef
						,_Fld1926RRef
						,_Fld1927RRef
						,_Fld1928RRef
						,_Fld1929RRef
						,_Fld1930RRef
						,_Fld1931RRef
						,_Fld1932
						,_Fld1933
						,_Fld1934
						,_Fld1935
						,_Fld1936
						,_Fld1937
						,_Fld1938
						,_Fld1939RRef
						,_Fld1940
						,_Fld1941
						,_Fld1942
						,_Fld1943
						,_Fld26614
						,_Fld26615RRef
						,_Fld26616
						,_Fld26617RRef
						,_Fld26618
						,_Fld26619RRef)
						Values(
						@Ссылка
						/*,@Версия*/
						,@ПометкаУдаления
						,@Предопределенный
						,@Код
						,@Наименование
						,@Комментарий
						,@СпособРаспределенияЗатратНаВыпуск
						,@ТипФильтраПриРаспределенииЗатратНаВыпуск
						,@БазаРаспределенияЗатрат
						,@ПоказательБазыРаспределения
						,@ТипЦен
						,@ОсновноеСырье
						,@СпособРаспределенияЗатратПоПодразделениям
						,@РаспределятьНаСобственнуюПродукцию
						,@РаспределятьНаПродукциюСтороннегоПереработчика
						,@РаспределятьНаПродукциюИзДавальческогоСырья
						,@РаспределятьНаПодчиненныеПодразделения
						,@РаспределятьНаНаработку
						,@Процент
						,@Коэффициент
						,@ПорядокОкругления
						,@НастройкиПостроителя
						,@ИзменитьНаПроцент
						,@ИзменитьНаКоэффициент
						,@ОкруглитьДо
						,@СхемаКомпоновкиДанных
						,@Применимость
						,@ИспользоватьПростоеРаспределение
						,@НаправлениеРаспределения
						,@КогдаПрименять
						,@ТипБазыРаспределения)";
					}
					else
					{
						Команда.CommandText = @"
						Update _Reference158
						Set
						/*_IDRRef	= @Ссылка*/
						/*,_Version	= @Версия*/
						_Marked	= @ПометкаУдаления
						,_IsMetadata	= @Предопределенный
						,_Code	= @Код
						,_Description	= @Наименование
						,_Fld1924	= @Комментарий
						,_Fld1925RRef	= @СпособРаспределенияЗатратНаВыпуск
						,_Fld1926RRef	= @ТипФильтраПриРаспределенииЗатратНаВыпуск
						,_Fld1927RRef	= @БазаРаспределенияЗатрат
						,_Fld1928RRef	= @ПоказательБазыРаспределения
						,_Fld1929RRef	= @ТипЦен
						,_Fld1930RRef	= @ОсновноеСырье
						,_Fld1931RRef	= @СпособРаспределенияЗатратПоПодразделениям
						,_Fld1932	= @РаспределятьНаСобственнуюПродукцию
						,_Fld1933	= @РаспределятьНаПродукциюСтороннегоПереработчика
						,_Fld1934	= @РаспределятьНаПродукциюИзДавальческогоСырья
						,_Fld1935	= @РаспределятьНаПодчиненныеПодразделения
						,_Fld1936	= @РаспределятьНаНаработку
						,_Fld1937	= @Процент
						,_Fld1938	= @Коэффициент
						,_Fld1939RRef	= @ПорядокОкругления
						,_Fld1940	= @НастройкиПостроителя
						,_Fld1941	= @ИзменитьНаПроцент
						,_Fld1942	= @ИзменитьНаКоэффициент
						,_Fld1943	= @ОкруглитьДо
						,_Fld26614	= @СхемаКомпоновкиДанных
						,_Fld26615RRef	= @Применимость
						,_Fld26616	= @ИспользоватьПростоеРаспределение
						,_Fld26617RRef	= @НаправлениеРаспределения
						,_Fld26618	= @КогдаПрименять
						,_Fld26619RRef	= @ТипБазыРаспределения
						Where _IDRRef = @Ссылка";
					}
					Команда.Parameters.AddWithValue("Ссылка", Ссылка.ToByteArray());
					/*Команда.Parameters.AddWithValue("Версия", Версия);*/
					Команда.Parameters.AddWithValue("ПометкаУдаления", ПометкаУдаления);
					Команда.Parameters.AddWithValue("Предопределенный", Предопределенный);
					Команда.Parameters.AddWithValue("Код", Код);
					Команда.Parameters.AddWithValue("Наименование", Наименование);
					Команда.Parameters.AddWithValue("Комментарий", Комментарий);
					Команда.Parameters.AddWithValue("СпособРаспределенияЗатратНаВыпуск", СпособРаспределенияЗатратНаВыпуск.Ключ());
					Команда.Parameters.AddWithValue("ТипФильтраПриРаспределенииЗатратНаВыпуск", ТипФильтраПриРаспределенииЗатратНаВыпуск.Ключ());
					Команда.Parameters.AddWithValue("БазаРаспределенияЗатрат", БазаРаспределенияЗатрат.Ключ());
					Команда.Parameters.AddWithValue("ПоказательБазыРаспределения", ПоказательБазыРаспределения.Ключ());
					Команда.Parameters.AddWithValue("ТипЦен", ТипЦен.Ссылка);
					Команда.Parameters.AddWithValue("ОсновноеСырье", ОсновноеСырье.Ссылка);
					Команда.Parameters.AddWithValue("СпособРаспределенияЗатратПоПодразделениям", СпособРаспределенияЗатратПоПодразделениям.Ссылка);
					Команда.Parameters.AddWithValue("РаспределятьНаСобственнуюПродукцию", РаспределятьНаСобственнуюПродукцию);
					Команда.Parameters.AddWithValue("РаспределятьНаПродукциюСтороннегоПереработчика", РаспределятьНаПродукциюСтороннегоПереработчика);
					Команда.Parameters.AddWithValue("РаспределятьНаПродукциюИзДавальческогоСырья", РаспределятьНаПродукциюИзДавальческогоСырья);
					Команда.Parameters.AddWithValue("РаспределятьНаПодчиненныеПодразделения", РаспределятьНаПодчиненныеПодразделения);
					Команда.Parameters.AddWithValue("РаспределятьНаНаработку", РаспределятьНаНаработку);
					Команда.Parameters.AddWithValue("Процент", Процент);
					Команда.Parameters.AddWithValue("Коэффициент", Коэффициент);
					Команда.Parameters.AddWithValue("ПорядокОкругления", ПорядокОкругления.Ключ());
					Команда.Parameters.AddWithValue("НастройкиПостроителя",new byte[0]);
					Команда.Parameters.AddWithValue("ИзменитьНаПроцент", ИзменитьНаПроцент);
					Команда.Parameters.AddWithValue("ИзменитьНаКоэффициент", ИзменитьНаКоэффициент);
					Команда.Parameters.AddWithValue("ОкруглитьДо", ОкруглитьДо);
					Команда.Parameters.AddWithValue("СхемаКомпоновкиДанных",new byte[0]);
					Команда.Parameters.AddWithValue("Применимость", Применимость.Ключ());
					Команда.Parameters.AddWithValue("ИспользоватьПростоеРаспределение", ИспользоватьПростоеРаспределение);
					Команда.Parameters.AddWithValue("НаправлениеРаспределения", НаправлениеРаспределения.Ключ());
					Команда.Parameters.AddWithValue("КогдаПрименять", КогдаПрименять);
					Команда.Parameters.AddWithValue("ТипБазыРаспределения", ТипБазыРаспределения.Ключ());
					Команда.ExecuteNonQuery();
				}
			}
		}
		public void Удалить()
		{
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					Команда.CommandText = @"Delete _Reference158
					Where _IDRRef=@Ссылка";
					Команда.Parameters.AddWithValue("Ссылка", Ссылка.ToByteArray());
					Команда.ExecuteNonQuery();
				}
			}
		}
		/*МодульОбъекта*/
		////////////////////////////////////////////////////////////////////////////////
		// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
		// Процедура заполняет начальные настройки построителя отчетов.
		//

		public void ЗаполнитьНачальныеНастройки(/*ПостроительОтчета*/)
		{
			//СтруктураПредставлениеПолей = Новый Структура;
			//МассивОтбора = Новый Массив;
			//МассивОтбора.Добавить("Подразделение");
			//МассивОтбора.Добавить("ПодразделениеОрганизации");
			if(true/*БазаРаспределенияЗатрат = Перечисления.БазыРаспределенияЗатрат.ПоОбъемуВыпуска
	 ИЛИ БазаРаспределенияЗатрат = Перечисления.БазыРаспределенияЗатрат.ПоОбъемуПродаж*/)
			{
				/*Текст = " 
		|ВЫБРАТЬ
		|	Подразделения.Ссылка 					КАК Подразделение
		|{ВЫБРАТЬ
		|	Подразделения.Ссылка.* 					КАК Подразделение,
		|	ПодразделенияОрганизаций.Ссылка.* 		КАК ПодразделениеОрганизации
		|}
		|ИЗ 
		|	Справочник.Подразделения 			КАК Подразделения,
		|	Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
		|{ГДЕ
		|	Подразделения.Ссылка.* 					КАК Подразделение,
		|	ПодразделенияОрганизаций.Ссылка.* 		КАК ПодразделениеОрганизации
		|}
		|";*/
			}
			/*// Соответствие имен полей в запросе и их представлений в отчете.
*/
			//СтруктураПредставлениеПолей = Новый Структура;
			//СтруктураПредставлениеПолей.Вставить("Подразделение", 			"Подразделение");
			//СтруктураПредставлениеПолей.Вставить("ПодразделениеОрганизации", "Подразделение организации");
			if(true/*БазаРаспределенияЗатрат <> Перечисления.БазыРаспределенияЗатрат.ПоОбъемуВыпуска
	   И БазаРаспределенияЗатрат <> Перечисления.БазыРаспределенияЗатрат.ПоОбъемуПродаж*/)
			{
				//СтруктураПредставлениеПолей.Вставить("ВидЗатрат",        		"Вид затрат");
				//СтруктураПредставлениеПолей.Вставить("СтатусМатериальныхЗатрат","Статус мат. затрат");
				//СтруктураПредставлениеПолей.Вставить("ХарактерЗатрат", 			"Характер затрат");
				//СтруктураПредставлениеПолей.Вставить("СтатьяЗатрат", 			"Статья затрат");
			}
			//ПостроительОтчета.Текст = Текст;
			//УправлениеОтчетами.ЗаполнитьПредставленияПолей(СтруктураПредставлениеПолей, ПостроительОтчета);
			//УправлениеОтчетами.ОчиститьДополнительныеПоляПостроителя(ПостроительОтчета);
			if(true/*(БазаРаспределенияЗатрат = Перечисления.БазыРаспределенияЗатрат.ПоОбъемуВыпуска
		ИЛИ БазаРаспределенияЗатрат = Перечисления.БазыРаспределенияЗатрат.ПоОбъемуПродаж)
		И ПостроительОтчета.Отбор.Количество() > 0*/)
			{
				//КолвоЭлементов = ПостроительОтчета.Отбор.Количество();
			}
		}
		// ЗаполнитьНачальныеНастройки()
		////////////////////////////////////////////////////////////////////////////////
		// ОБРАБОТЧИКИ СОБЫТИЙ
		// Процедура обработчик события "ПриКопировании"
		//

		public void ПриКопировании(/*ОбъектКопирования*/)
		{
			if(true/*ОбъектКопирования.ТипБазыРаспределения = Перечисления.ТипыБазРаспределения.Предопределенный*/)
			{
				//ТипБазыРаспределения = Перечисления.ТипыБазРаспределения.СКД;
				/*// тип базы Предопределенный преобразуем в СКД
*/
			}
		}
		// Процедура обработчик события "ОбработкаПроверкиЗаполнения"
		//

		public void ОбработкаПроверкиЗаполнения(/*Отказ, ПроверяемыеРеквизиты*/)
		{
			if(true/*ОбменДанными.Загрузка*/)
			{
			}
			if(true/*БазаРаспределенияЗатрат = Перечисления.БазыРаспределенияЗатрат.ПоСтоимостиЗатрат
	 И ТипФильтраПриРаспределенииЗатратНаВыпуск = Перечисления.ТипыФильтровПриРаспределенииЗатратНаВыпуск.Продукция*/)
			{
				//Заголовок = НСтр("ru = 'Запись способа распределения на выпуск ""%Наименование%""'");
				//Заголовок = СтрЗаменить(Заголовок, "%Наименование%", Наименование);
				//ОбщегоНазначения.СообщитьОбОшибке(Нстр("ru = 'Для базы ""По стоимости затрат"" нельзя использовать направление распределения ""На некоторую продукцию""'"), Отказ, Заголовок,СтатусСообщения.Важное, Ссылка);
			}
			/*// Исключим из проверки реквизиты табличных частей, не используемых для указанного направления распределения
*/
			//ТабличныеЧасти 			  = Справочники.СпособыРаспределенияЗатратНаВыпуск.ПолучитьИменаНеиспользуемыхТабличныхЧастей(ЭтотОбъект);
			//СтруктураНеиспользуемыхТЧ = Новый Структура(ТабличныеЧасти);
			//НепроверяемыеРеквизиты 	  = Новый Массив;
			/*// Удалим реквизиты, которые не надо проверять, из массива проверяемых реквизитов
*/
		}
		// Процедура обработчик события "ПередЗаписью"
		//

		public void ПередЗаписью(/*Отказ*/)
		{
			if(true/*ОбменДанными.Загрузка*/)
			{
			}
			/*// Очистим неиспользуемые табличные части
*/
			//ТабличныеЧасти 		 = Справочники.СпособыРаспределенияЗатратНаВыпуск.ПолучитьИменаНеиспользуемыхТабличныхЧастей(ЭтотОбъект);
			//СтруктураОчищаемыхТЧ = Новый Структура(ТабличныеЧасти);
			/*// Очистим СКД если она не используется в текущем способе распределения
*/
			if(true/*ТипБазыРаспределения <> Перечисления.ТипыБазРаспределения.Предопределенный
	 И ТипБазыРаспределения <> Перечисления.ТипыБазРаспределения.СКД
	 И СхемаКомпоновкиДанных.Получить() <> Неопределено*/)
			{
				//СхемаКомпоновкиДанных = Новый ХранилищеЗначения(Неопределено);
			}
			/*// Очистим настройки построителя отчета если они не используются в текущем способе распределения
*/
			if(true/*ИспользоватьПростоеРаспределение
	 И НастройкиПостроителя.Получить() <> Неопределено*/)
			{
				//НастройкиПостроителя = Новый ХранилищеЗначения(Неопределено);
			}
		}
	}
}